package com.iceclean.serviceImpl;

import com.iceclean.dao.UserDao;
import com.iceclean.daoImpl.UserDaoImpl;
import com.iceclean.po.User;
import com.iceclean.service.UserService;
import com.iceclean.util.ServiceAgent;

/**
 * @author : Ice'Clean
 * @date : 2021-05-01
 *
 * 用户服务实现类
 */
public class UserServiceImpl implements UserService {

    UserDao userDao = new UserDaoImpl();

    @Override
    public User findUserById(int userId) {
        return userDao.findUserById(userId);
    }

    @Override
    public User findUserByUserName(String userName) {
        return userDao.findUserByUserName(userName);
    }

    @Override
    public User loginUser(String userName, String userPass) {
        // 查找用户并匹配密码，匹配成功则返回该用户实例，否则返回空
        User user = findUserByUserName(userName);
        if (user != null && userPass.equals(changeCode(user.getUserPass(), user.getUserName()))){
            return user;
        }

        return  null;
    }

    @Override
    public User createNewUser(String userName, String userPass, String userPostBox) {
        // 将密码加密，再存放到数据库中
        int id = userDao.createNewUser(new User(userName, "游客", changeCode(userPass, userName), userPostBox));
        return userDao.findUserById(id);
    }

    @Override
    public boolean updateUser(User user) {
        return userDao.updateUser(user);
    }

    /**
     * 选择以用户名作为密钥，则每个用户加密过程不同
     * 将密码和用户名拆分为字符数组
     * 把密码的每一个字符分别与每一个用户名字符进行异或运算（如密码为 6 位，用户名为 5 位，则进行 30 次异或运算）
     * @param content 需要加密的内容
     * @param codeKey 解密 / 解密的密钥
     * @return 加密 / 解密后的内容
     */
    @Override
    public String changeCode(String content, String codeKey) {
        char[] result = content.toCharArray();
        char[] keys = codeKey.toCharArray();

        for (int i=0; i < result.length; i++) {
            for (char key : keys) {
                result[i] ^= key;
            }
        }

        return new String(result);
    }
}
